#ifndef __VTL_VECTOR_H
#define __VTL_VECTOR_H

#include "vglobal.h"

#ifdef __cplusplus
extern "C" {
#endif

V_DECLEAR_HANDLE(vVector);
V_DECLEAR_HANDLE(vVectorIterator);

typedef struct
{
    void (*vVectorFree)(void *);
}vVectorOps;

vVector vVectorNew(size_t typesize,vVectorOps *ops);
void vVectorDelete(vVector vv);

/**
*@brief return vector[index]
*/
void *vVectorEntry(vVector vv, size_t index);
/**
*@brief 访问第一个元素
*/
void *vVectorFront(vVector vv);
/**
*@brief 访问最后一个元素
*/
void *vVectorBack(vVector vv);
/**
*@brief 返回指向第一个元素的迭代器
*/
vVectorIterator vVectorBegin(vVector vv);
/**
*@brief 返回指向最后一个元素的迭代器
*/
vVectorIterator vVectorEnd(vVector vv);
/**
*@brief 返回指向下一个元素的迭代器，如果成功，则返回真
*/
bool vVectorNext(vVectorIterator iter);
/**
*@brief 返回指向上一个元素的迭代器，如果成功，则返回真
*/
bool vVectorPrev(vVectorIterator iter);
/**
*@brief取出迭代器中的数据
*/
void *vVectorGet(vVectorIterator iter);
/**
*@brief 释放一个迭代器
*/
void vVectorFreeIterator(vVectorIterator iter);
/**
*@brief 判断vector是否为空
*/
bool vVectorEmpty(vVector vv);

/**返回容纳的元素数 */
size_t vVectorSize(vVector vv);

/**返回当前存储空间能够容纳的元素数 */
size_t vVectorCapacity(vVector vv);

/**预留存储空间 */
void vVectorReserve(vVector vv, size_t new_cap);

/**改变vector中容纳元素的个数 */
void vVectorResize(vVector vv, size_t count);

/**释放未使用的内存 */
void vector_shrink_to_fit(vVector vv);

/**在pos之前插入一个元素 */
void vVectorInsert(vVector vv, vVectorIterator pos, const void *data);

/**在pos之前插入从data开始的count个元素 */
void vVectorInsert1(vVector vv, vVectorIterator pos, const void *data, size_t count);

/**删除pos处的元素 */
void vVectorErase(vVector vv, vVectorIterator pos);

/**在vector末尾添加一个元素
 * 假如要添加元素e，则需要vector_push_back(v, &e)(这里&必不可少)
 * 不管e是一个值还是一个指针，都需如此
 */
void vVectorPushBack(vVector vv, const void *data);

/**从vector末尾弹出一个元素 */
void vVectorPopBack(vVector vv);

/**交换两个元素 */
void vVectorSwap(vVector vv, size_t i, size_t j);

/**清空vector */
void vVectorClear(vVector vv);

#ifdef __cplusplus
}
#endif

#endif
